package org.soderiakelvy.model.service.imp;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.soderiakelvy.model.dao.CondicionIvaDao;
import org.soderiakelvy.model.dao.ContribucionDao;
import org.soderiakelvy.model.dao.DesProdTipoCliDao;
import org.soderiakelvy.model.dao.ProductoDao;
import org.soderiakelvy.model.dao.SujetoDao;
import org.soderiakelvy.model.dao.TipoClienteDao;
import org.soderiakelvy.model.dao.imp.CondicionIvaDaoImp;
import org.soderiakelvy.model.dao.imp.ContribucionDaoImp;
import org.soderiakelvy.model.dao.imp.DesProdTipoCliDaoImp;
import org.soderiakelvy.model.dao.imp.ProductoDaoImp;
import org.soderiakelvy.model.dao.imp.SujetoDaoImp;
import org.soderiakelvy.model.dao.imp.TipoClienteDaoImp;
import org.soderiakelvy.model.domain.CondicionIvaVO;
import org.soderiakelvy.model.domain.ContribucionVO;
import org.soderiakelvy.model.domain.DesProdTipoCliVO;
import org.soderiakelvy.model.domain.ProductoVO;
import org.soderiakelvy.model.domain.SujetoVO;
import org.soderiakelvy.model.domain.TipoClienteVO;
import org.soderiakelvy.model.domain.TipoProductoVO;
import org.soderiakelvy.model.service.SujetoServicio;
import org.soderiakelvy.model.util.ConstantModel;

public class SujetoServicioImpl implements SujetoServicio, Serializable{ 
	private static final long serialVersionUID = 1L;
	private SujetoDao sujetoDao;
    private TipoClienteDao tipoClienteDao; 
    private ContribucionDao contribucionDao;
    private CondicionIvaDao condicionIvaDao;
    private DesProdTipoCliDao desProdTipoCliDao;

    //--- CONSTRUCTOR ----
    public SujetoServicioImpl(){		
        sujetoDao = new SujetoDaoImp();
        tipoClienteDao = new TipoClienteDaoImp();
        contribucionDao = new ContribucionDaoImp();
        condicionIvaDao = new CondicionIvaDaoImp();
        desProdTipoCliDao = new DesProdTipoCliDaoImp();
    }

    //------- SUJETO SERVICES ---------
	@Override
	public String insertSujetoVO(SujetoVO sujeto) {
		sujeto.setFechaAlta(new Date());
		try {
			sujetoDao.insertSujetoVO(sujeto);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al insertar un sujeto. "+e.getMessage());
			return ConstantModel.FAILED;
		}
	}

	@Override
	public String updateSujetoVO(SujetoVO sujeto) {
		try {
			sujetoDao.updateSujetoVO(sujeto);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al modificar un sujeto. "+e.getMessage());
			return ConstantModel.FAILED;
		}
		
	}

	@Override
	public String deleteSujetoVO(SujetoVO sujeto) {
		try {
			sujetoDao.deleteSujevoVO(sujeto);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al eliminar un sujeto. "+e.getMessage());
			return ConstantModel.FAILED;
		}
		
	}

	@Override
	public SujetoVO getSujetoVO(SujetoVO sujeto) {
		try {
			return sujetoDao.getSujetoVO(sujeto);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al obtener un sujeto. "+e.getMessage());
			return null;
		}
	}

	@Override
	public List<SujetoVO> getAllSujetoVO() {
		return null;
	}
	//------------------------------------------
	//--------- TIPO CLIENTE SERIVICES ---------
	
	@Override
	public String insertTipoCliente(TipoClienteVO tipoCliente, List<DesProdTipoCliVO> productosConDescuentos) {
		tipoCliente.setNombre(tipoCliente.getNombre().toUpperCase().trim());
		try {
			tipoClienteDao.insertTipoCliente(tipoCliente);
			for(DesProdTipoCliVO p: productosConDescuentos){
				p.setTipoCliente(tipoCliente);
				desProdTipoCliDao.insertDesProdTipoCliVO(p);
			}
			return ConstantModel.SUCCESS;	
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al insertar un tipo de cliente. "+e.getMessage());
			return ConstantModel.FAILED;
		}
		
	}

	@Override
	public String updateTipoCliente(TipoClienteVO tipoCliente,List<DesProdTipoCliVO> productosConDescuentos) {
		try {
			tipoClienteDao.updateTipoCliente(tipoCliente);
			for(DesProdTipoCliVO descuento : productosConDescuentos){
				desProdTipoCliDao.updateDesProdTipoCliVO(descuento);
			}
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al actualizar un tipo de cliente. "+e.getMessage());
			return ConstantModel.FAILED;
		}
		
	}

	@Override
	public String deleteTipoCliente(TipoClienteVO tipoCliente) {
		if(!existenSujetosDeTipoCliente(tipoCliente)){
			try {
				tipoClienteDao.deleteTipoCliente(tipoCliente);
				return ConstantModel.SUCCESS;
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("Error al eliminar un tipo de cliente. "+e.getMessage());
				return ConstantModel.FAILED;
			}
		}else {
			return ConstantModel.DELETE_ASIGNADO;
		}		
	}

	
	private boolean existenSujetosDeTipoCliente(TipoClienteVO tc){
		if(sujetoDao.getSujetoByTipoCliente(tc).isEmpty()){
			System.out.println(" NO HAY sujetos asignados");
			return false;
			
		}else {
			System.out.println(" SI  HAY sujetos asignados");
			return true;
		}
	}

	
	@Override
	public TipoClienteVO getTipoClienteById(long tipoClienteId) {
		try{
			return tipoClienteDao.getTipoClienteById(tipoClienteId);
		}catch (Exception e){
			e.printStackTrace();
			System.out.println("Error al Obtener un TipoCliente por su ID    "+ e.getMessage());
			return null;			
		}
	}
	
	@Override
	public List<TipoClienteVO> getAllTipoClienteVO() {
		try {
			return tipoClienteDao.getAllTiposDeClientes();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al al listar los tipo de cliente. "+e.getMessage());
			return null;
		}
	}
	
	
	public Boolean existeNombreTipoCliente(String nombre) {
		
		try{
			if (tipoClienteDao.getTipoClienteByNombre(nombre) != null){
				return true;
			}else
				return false;
		}catch (Exception e){
			e.printStackTrace();
			System.out.println("Error al buscar nombre de Tipo de Cliente. "+e.getMessage());
			return null;	
		}
	}
	
	//------------------------------------------

	//--------- CONTRIBUCIION SERVICES ---------

	@Override
	public String insertContribucionVO(ContribucionVO contribucion) {
		try {
			contribucionDao.insertContribucionVO(contribucion);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			return ConstantModel.FAILED;
		}
	}

	@Override
	public String deleteContribucionVO(ContribucionVO contribucion) {
		try {
			contribucionDao.deleteContribucionVO(contribucion);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			return ConstantModel.FAILED;
		}
	}

	@Override
	public String updateContribucionVO(ContribucionVO contribucion) {
		try {
			contribucionDao.updateContribucionVO(contribucion);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			return ConstantModel.FAILED;
		}
	}
	
	@Override
	public ContribucionVO getContribucionBySujeto(SujetoVO sujeto) {
		try {
			return contribucionDao.getContribucionBySujeto(sujeto);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	//---------------------------------------------

	//--------- CONDICION DE IVA SERVICE ----------
	@Override
	public String insertCondicionIvaVO(CondicionIvaVO condicionIva) {
		try {
			condicionIvaDao.insertCondicionIvaVO(condicionIva);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			return ConstantModel.FAILED;
		}
	}

	
	@Override
	public String updateCondicionIvaVO(CondicionIvaVO condicionIva) {
		try {
			condicionIvaDao.updateCondicionIvaVO(condicionIva);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			return ConstantModel.FAILED;
		}
	}

	@Override
	public String deleteCondicionIvaVO(CondicionIvaVO condicionIva) {
		if(!existenContribucionesDeCondicionIva(condicionIva)){
			try {
				condicionIvaDao.deleteCondicionIvaVO(condicionIva);
				return ConstantModel.SUCCESS;
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("Error al eliminar una Condicion de Iva. "+e.getMessage());
				return ConstantModel.FAILED;
			}
		}else {
			return ConstantModel.DELETE_ASIGNADO;
		}		
	}
	
	private boolean existenContribucionesDeCondicionIva(CondicionIvaVO ci){
		if(contribucionDao.getContibucionesByCondicionIva(ci).isEmpty()){
			System.out.println(" NO HAY contribuciones asignados");
			return false;
			
		}else {
			System.out.println(" SI  HAY contribuciones asignados");
			return true;
		}
	}
	
	@Override
	public List<CondicionIvaVO> getAllCondicioIvaVO() {
		try {
			return condicionIvaDao.getAllCondicionIva();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al al listar las Condiciones de Iva. "+e.getMessage());
			return null;
		}
	}

	
	//-----------------------------METODOS PARA DESPRODTIPOCLI ---------------------------------
	@Override
	public String insertDesProdTipoCliVO(DesProdTipoCliVO desProdTipoCli) {
		try {
			desProdTipoCliDao.insertDesProdTipoCliVO(desProdTipoCli);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			return ConstantModel.FAILED;
		}
	}

	@Override
	public String deleteDesProdTipoCliVO(DesProdTipoCliVO desProdTipoCli) {
		try {
			desProdTipoCliDao.deleteDesProdTipoCliVO(desProdTipoCli);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error al eliminar un DesProdTipoCli. "+e.getMessage());
			return ConstantModel.FAILED;
		}	
	}

	@Override
	public String updateDesProdTipoCliVO(DesProdTipoCliVO desProdTipoCli) {
		try {
			desProdTipoCliDao.updateDesProdTipoCliVO(desProdTipoCli);
			return ConstantModel.SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			return ConstantModel.FAILED;
		}
	}

	@Override
	public List<DesProdTipoCliVO> getProductosConDescuentoByTipoCliente(TipoClienteVO tipoCliente) {
		try {
			return desProdTipoCliDao.getALLDesProdTipoCliByTipoCli(tipoCliente);
		
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}		
	}
	//--------------------------------------------------

	@Override
	public String assignProductosToTipoCliente(TipoClienteVO tipoCliente, ProductoVO[] productosSeleccionados) {
		
		return null;
	}

	@Override
	public TipoClienteVO getDefaultValue() {
		try {
			return tipoClienteDao.getDefaultValue();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

}
